#方法一：使用pygame模块
import pygame
import random
import sys

#定义常量
BLOCK_SIZE = 20 #格子大小
MINE_COUNT = 40 #地雷数
BLOCK_WIDTH = 16 #横向格子数
BLOCK_HEIGHT = 16 #纵向格子数
SCREEN_WIDTH = BLOCK_WIDTH * BLOCK_SIZE #屏幕宽度
SCREEN_HEIGHT = BLOCK_HEIGHT * BLOCK_SIZE #屏幕高度

#定义颜色
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (192, 192, 192)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

#定义字体
pygame.font.init()
FONT = pygame.font.SysFont("consolas", 16)

#定义图片
pygame.image.load("block.png")
pygame.image.load("flag.png")
pygame.image.load("mine.png")
pygame.image.load("face_fail.png")
pygame.image.load("face_normal.png")
pygame.image.load("face_success.png")

#定义状态
STATUS_READY = 0 #准备阶段
STATUS_PLAYING = 1 #游戏中
STATUS_SUCCESS = 2 #成功通关
STATUS_FAIL = 3 #失败

#定义方块类
class Block():
    def __init__(self):
        self.value = 0 #值：-1表示地雷，0-8表示周围地雷数
        self.opened = False #是否被打开
        self.flagged = False #是否被标记

    def open(self):
        self.opened = True

    def flag(self):
        self.flagged = not self.flagged

    def has_mine(self):
        return self.value == -1

    def set_mine(self):
        self.value = -1

    def set_value(self, value):
        self.value = value

    def get_value(self):
        return self.value

#初始化方块数组
blocks = [[Block() for col in range(BLOCK_WIDTH)] for row in range(BLOCK_HEIGHT)]

#初始化游戏状态和计时器
status = STATUS_READY
start_time = None

#初始化pygame和屏幕对象
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("扫雷")

#主循环
while True:
    #获取事件并处理
    for event in pygame.event.get():
        if event.type == pygame.QUIT: #退出事件
            pygame.quit()
            sys.exit()
        elif event.type == pygame.MOUSEBUTTONDOWN: #鼠标点击事件
            mouse_x, mouse_y = event.pos #获取鼠标位置（像素坐标）
            block_x, block_y = mouse_x // BLOCK_SIZE, mouse_y // BLOCK_SIZE #获取方块索引（方块坐标）
            if status == STATUS_PLAYING: #如果是游戏中状态
                if event.button == 1: #如果是鼠标左键点击
                    if blocks[block_y][block_x].flagged: #如果被标记则忽略不处理
                        continue
                    blocks[block_y][block_x].open() #打